import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

class Plot_arknights(object):


    def plot_line(self,path: str):
        # 设置支持中文的字体
        plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体显示中文
        plt.rcParams['axes.unicode_minus'] = False    # 解决负号显示问题
        
        try:
            # 读取数据
            df = pd.read_excel(path)
            
            # 1. 显示可用列名供用户选择
            print("\n可用属性列:")
            for col in df.columns:
                if col != '昵称':
                    print(f"- {col}")
            
            # 获取用户选择的列
            while True:
                selected_col = input("\n请输入要绘制的属性名称: ").strip()
                if selected_col in df.columns:
                    break
                else:
                    print(f"错误: '{selected_col}' 不是有效的属性名称")
                    print("请从以下属性中选择:")
                    print(", ".join(df.columns))
            
            # 设置昵称为索引
            df.set_index('昵称', inplace=True)
            
            # 创建图表
            plt.figure(figsize=(14, 7))  # 设置更大的图表尺寸
            
            # 绘制折线图
            line = df[selected_col].plot(
                kind='line',
                marker='o',         # 添加数据点标记
                markersize=8,       # 标记大小
                linestyle='-',      # 实线
                linewidth=2,        # 线条粗细
                color='blue'        # 线条颜色
            )
            
            # 添加图表装饰
            plt.title(f'{selected_col}变化趋势', fontsize=16)
            plt.xlabel('昵称', fontsize=12)
            plt.ylabel(f'{selected_col}', fontsize=12)
            plt.grid(True, linestyle='--', alpha=0.7)  # 添加网格线
            
            # 旋转X轴标签以避免重叠
            plt.xticks(
                range(len(df.index)), 
                df.index,
                rotation=45,
                ha='right',
                rotation_mode='anchor',
                fontsize=10
            )

            # 自动调整格式
            plt.gcf().autofmt_xdate()

            # 增加底部边距（关键）
            plt.subplots_adjust(bottom=0.25)

            # 在点上显示数值
            for i, value in enumerate(df[selected_col]):
                # 在点上显示数值
                plt.text(
                    i,                      # X位置（索引）
                    value,                  # Y位置（数值）
                    f'{value}',             # 显示的文本
                    ha='center',            # 水平居中
                    va='bottom',            # 垂直底部对齐
                    fontsize=10,            # 字体大小
                    bbox=dict(              # 文本框样式
                        boxstyle='round,pad=0.2',
                        facecolor='white',
                        edgecolor='gray',
                        alpha=0.8
                    )
                )
            
            # ===== 新增部分：计算并显示统计指标 =====
            # 计算统计值
            max_val = df[selected_col].max()
            min_val = df[selected_col].min()
            avg_val = df[selected_col].mean()
            range_val = max_val - min_val
            
            # 找到最大值和最小值的位置
            max_idx = df[selected_col].idxmax()
            min_idx = df[selected_col].idxmin()
            
            # 标记最大值点
            max_x = df.index.get_loc(max_idx)
            plt.scatter(max_x, max_val, s=200, marker='*', color='gold', edgecolor='black', zorder=5)
            plt.annotate(f'最大值: {max_val}', 
                        xy=(max_x, max_val),
                        xytext=(max_x+0.5, max_val),
                        arrowprops=dict(facecolor='black', shrink=0.05),
                        fontsize=10,
                        bbox=dict(boxstyle="round,pad=0.3", fc="gold", ec="black", alpha=0.8))
            
            # 标记最小值点
            min_x = df.index.get_loc(min_idx)
            plt.scatter(min_x, min_val, s=150, marker='v', color='lightgreen', edgecolor='black', zorder=5)
            plt.annotate(f'最小值: {min_val}', 
                        xy=(min_x, min_val),
                        xytext=(min_x+0.5, min_val),
                        arrowprops=dict(facecolor='black', shrink=0.05),
                        fontsize=10,
                        bbox=dict(boxstyle="round,pad=0.3", fc="lightgreen", ec="black", alpha=0.8))
            
            # 添加平均值线
            plt.axhline(y=avg_val, color='red', linestyle='--', linewidth=1.5)
            plt.text(len(df.index)-0.5, avg_val, 
                    f'平均值: {avg_val:.2f}', 
                    ha='right', va='bottom', 
                    fontsize=10,
                    bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="red", alpha=0.8))
            
            # 添加极差信息
            plt.text(0.02, 0.98, 
                    f'极差: {range_val:.2f} (最大-最小)', 
                    transform=plt.gca().transAxes,
                    ha='left', va='top', 
                    fontsize=10,
                    bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="blue", alpha=0.8))
            # ===== 新增部分结束 =====
            
            # 调整布局防止标签被截断
            plt.tight_layout()
            
            # 显示图表
            plt.show()
            
            # 2. 询问用户是否保存图表
            save_choice = input("\n是否保存图表? (y/n): ").strip().lower()
            if save_choice == 'y':
                # 获取保存路径
                save_dir = os.path.dirname(path)
                default_filename = f"{selected_col}_趋势图.png"
                save_path = os.path.join(save_dir, default_filename)
                
                # 允许用户自定义文件名
                custom_name = input(f"输入文件名 (默认为 '{default_filename}'): ").strip()
                if custom_name:
                    # 确保文件名有.png扩展名
                    if not custom_name.lower().endswith('.png'):
                        custom_name += '.png'
                    save_path = os.path.join(save_dir, custom_name)
                
                # 保存图表
                plt.savefig(save_path, dpi=300, bbox_inches='tight')
                print(f"图表已保存至: {save_path}")
        
        except FileNotFoundError:
            print(f"错误: 文件未找到 - {path}")
        except Exception as e:
            print(f"发生错误: {str(e)}")